3.6.12.18 ReLU系命令
ReLU系命令はいずれも 2 入力で、表3.12で定義される。
入出力値はすべて浮動小数点数である。
relu0命令はrelu命令へのエイリアスである。
table:表3.12 ReLU系命令の定義。第 1 入力をx、第 2 入力をyで表す。
オペランド 定義
relu/relu0 xのMSBが 0 のときyを、 1 のとき− 0 を返す
relu1 xの上から(1-originで) 2番目のビットが 0 のときyを、 1 のとき− 0 を返す
relu2 xの上から 3 番目のビットが 0 のときyを、 1 のとき− 0 を返す
relu3 xの上から 4 番目のビットが 0 のときyを、 1 のとき− 0 を返す
lrelud xのMSBが 0 のときyを、 1 のときy/ 2 を返す
lreluo xのMSBが 0 のときyを、 1 のときy/ 8 を返す
ilrelud xのMSBが 0 のときyを、 1 のときyの指数部をインクリメントしたものを返す
lrelud命令、lreluo、およびilrelud命令のlはleakyの頭文字である。
ilrelud命令のiはinverseの頭文字である。
lrelud命令とlreluo命令は結果がアンダーフローする可能性がある。
その際は符号ビットが負で、指数部と仮数部が 0 の値を返す。
ilrelud命令は結果がオーバーフローする可能性がある。
その際は指数部の全ビットが 1 で、符号と仮数部は入力と同じである値を返す。
また、xのMSBが 1 ならば、yの指数部の全ビットが 0 でも指数部がインクリメントされる、すなわちy= 0.0 に対して 0 でない出力が返ることに注意。
これらの定義はReLU系関数のforwardとbackwardの両方を計算できるようにするためのものである。
浮動小数点数のMSBは符号ビットであるから、relu命令の定義は概ね、xが非負ならy、負なら 0 を返すというものになる。
ここでvを入力としたReLU関数のforwardの結果をwと置く。
これはrelu命令を用いてw=relu(v, v)で計算できる。
ReLU関数のbackward、すなわちwに関する勾配w′からvに関する勾配を求める計算をしたい場合は、relu(v, w′)またはrelu(w, w′)を実行すればよい。
この後者はrelu(v, v)の結果がvの符号を保存することから可能になっている。